#include <termios.h>
#include <ctype.h>
+#include <time.h>
#include "defs.h"
#include "magellan.h"
-#define debug 1
+#define debug 0
typedef enum {
mrs_handoff = 0,
static int last_rx_csum;
static int found_done;
static icon_mapping_t *icon_mapping;
+static int got_version;
static waypoint * mag_wptparse(char *);
static void
mag_writeack(int osum)
{
- char obuf[100];
+ char obuf[200];
snprintf(obuf, sizeof(obuf), "PMGNCSM,%02X", osum);
mag_writemsg(obuf);
}
int prodid = mm_unknown;
char version[1024];
pid_to_model_t *pp = pid_to_model;
+
+ got_version = 1;
sscanf(ibuf,"$PMGNVER,%d,%[^,]", &prodid, version);
for (pp = pid_to_model; pp->model ; pp++) {
static void
mag_readmsg(void)
{
- char ibuf[100];
+ char ibuf[200];
int isz;
unsigned int isum;
char *isump;
- fgets(ibuf, sizeof(ibuf), magfile);
+ char *gr;
+
+ gr = fgets(ibuf, sizeof(ibuf), magfile);
+
+ if (!gr && !got_version) {
+ fatal("Magproto: No data received from GPS.\n");
+ }
+
isz = strlen(ibuf);
+
if (isz < 5) {
-if (debug)
-fprintf(stderr, "SHORT READ %d\n", isz);
+ if (debug)
+ fprintf(stderr, "SHORT READ %d\n", isz);
return;
}
while (!isprint(ibuf[isz]))
if (isum != mag_pchecksum(&ibuf[1], isz-3)) {
if (debug)
fprintf(stderr, "RXERR %02x/%02x: '%s'\n", isum, mag_pchecksum(&ibuf[1],isz-5), ibuf);
+ /* Special case receive errors early on. */
+ if (!got_version) {
+ fatal("Magproto: bad communication. Check bit rate.\n");
+ }
}
if (debug)
fprintf(stderr, "READ: %s\n", ibuf);
mag_rd_init(const char *portname)
{
struct termios new_tio;
+ time_t now, later;
+
magfile = fopen(portname, "rw+b");
if (magfile == NULL) {
new_tio.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
new_tio.c_cflag &= ~(CSIZE|PARENB);
new_tio.c_cflag |= CS8;
+ new_tio.c_cc[VTIME] = 10;
+ new_tio.c_cc[VMIN] = 0;
cfsetospeed(&new_tio, B4800);
cfsetispeed(&new_tio, B4800);
tcsetattr(magfd, TCSAFLUSH, &new_tio);
mag_handon();
+ now = time(NULL);
+ later = now + 2;
mag_writemsg("PMGNCMD,VERSION");
+
+ while (!got_version) {
+ mag_readmsg();
+ if (time(NULL) > later) {
+ fatal("Magproto: No acknowledgment from GPS on %s\n",
+ portname);
+ }
+ }
+
mag_writemsg("PMGNCMD,NMEAOFF");
return;
}